import queue
'''
Queue 是一个 FIFO 队列，任务按照添加的顺序被取出。
LifoQueue 是一个 LIFO 队列，类似堆栈，后添加的任务先被取出。
PriorityQueue 是一个优先级队列，队列里面的任务按照优先级排序，优先级高的先被取出。

exception queue.Empty
# 对空的 Queue 对象调用非阻塞的 get() (or get_nowait()) 时，会引发该异常。

exception queue.Full
# 对满的 Queue 对象调用非阻塞的 put() (or put_nowait()) 时，会引发该异常。
'''
# q = queue.Queue(maxsize=1)
# q.put(100)
# q.put(100,True,2)
# q.put(100, False, 2)
# 当 block 为 false 时，timeout 参数将失效。同时如果队列中没有空余的位置可添加任务则会引发 Full 异常，否则会直接把任务放入队列并返回，不会阻塞。
# 另外，还可以通过 Queue.put_nowait(item) 来添加任务，相当于 Queue.put(item, False)，不再赘述。同样，在队列满时，该操作会引发 Full 异常
# print(q.get())

# q = queue.Queue(maxsize=2)
# q.put(100)
# q.put(200)
# 获取队列大小
# print(q.qsize())
# 判断队列是否空
# print(q.empty())
# 判断队列是否满
# print(q.full())

# FIFO 队列
# q = queue.Queue()
# for index in range(10):
#     q.put(index)
# while not q.empty():
#     print(q.get(), end=", ")
# LIFO 队列
# q = queue.LifoQueue() # 创建一个 LIFO 队列
# for index in range(10):
#     q.put(index)
# while not q.empty():
#     print(q.get(), end=", ")
# 优先级队列 优先级队列中的任务顺序跟放入时的顺序是无关的，而是按照任务的大小来排序，最小值先被取出
# q = queue.PriorityQueue()
# for index in range(10,0,-1):
#     q.put(index)
# while not q.empty():
#     print(q.get(), end=", ")

# 如果是列表或者元祖，则先比较第一个元素，然后比较第二个，以此类推，直到比较出结果
# q = queue.PriorityQueue()
# q.put(["d","b"])
# q.put(["c","b"])
# while not q.empty():
#     print(q.get(), end=", ")
'''
因为列表的比较对规则是按照下标顺序来比较的，所以在没有比较出大小之前 ，队列中所有列表对应下标位置的元素类型要一致，
类型不一致放入不了优先级队列
直到在比较出结果之前，对应下标位置的元素类型都是需要一致的
'''

q = queue.PriorityQueue()

class Animal:
    def __init__(self, age, name):
        self.age = age
        self.name = name
    def __lt__(self, other): # 实现 < 操作  判断self对象是否小于other对象
        return self.age < other.age # 如果将 < 变成 > 则相当于逆序

q.put(Animal(3,"cat"))
q.put(Animal(2,"dog"))

while not q.empty():
    animal = q.get()
    print(animal.name, animal.age, end=", ")